package edu.tfh.s2.ehkbot.gerete.aktoren;

import edu.tfh.s2.ehkbot.steuerung.BusAdresse;
import edu.tfh.s2.ehkbot.steuerung.BusAdressierbar;

/**
 * Der BiStateAktor ist ein Aktor der nur zwei Zustände kennt. Gebraucht wird das für die E-Magnete und
 * Saugnäpfe. Der BiStateAktor nutzt das State Pattern um zwischen Simulation und Real andere Verhalten zu
 * Implementieren.
 * 
 * @author s2zehn
 */
public class BiStateAktor implements BusAdressierbar {
	/**
	 * Das State Interface für BiStateAktor.  (Siehe State Pattern)
	 */
	public interface BiStateAktorState {
		/**
		 * Aktivert den Aktor.
		 */
		public void aktiviere();

		/**
		 * Deaktiviert den Aktor
		 */
		public void deaktivier();

		/**
		 * Gibt zurück ob er sich in Zustand Aktiviert befindet.
		 * 
		 * @return true fals er sich in Aktiviert befindet.
		 */
		public boolean istAktiviert();

		/**
		 * Testet ob er Funktioniert.
		 * 
		 * @return true für den fall das er Funktioniert.
		 */
		public boolean testeFunktion();
	}

	private BusAdresse busAdresse;

	private BiStateAktorState state;

	/**
	 * Konstruktor für BiStateAktor.
	 * @param busAdresse Die BusAdresse für diesen Aktor
	 * @param state Das State (siehe State Pattern)
	 */
	public BiStateAktor(BusAdresse busAdresse, BiStateAktorState state) {
		super();
		this.state = state;
		this.busAdresse = busAdresse;
	}

	/**
	 * Aktiviert den Aktor.
	 */
	public void aktiviere() {
		state.aktiviere();
	}

	/**
	 * Deaktiviert den Aktor.
	 */
	public void deaktiviere() {
		state.deaktivier();
	}

	/**
	 * @see edu.tfh.s2.ehkbot.steuerung.BusAdressierbar#getBusAdresse()
	 */
	@Override
	public BusAdresse getBusAdresse() {
		return busAdresse;
	}

	/**
	 * Gibt zurück ob er sich in Zustand Aktiviert befindet.
	 * 
	 * @return true fals er sich in Aktiviert befindet.
	 */
	public boolean istAktiviert() {
		return state.istAktiviert();
	}

	/**
	 * @see edu.tfh.s2.ehkbot.steuerung.BusAdressierbar#setBusAdresse(edu.tfh.s2.ehkbot.steuerung.BusAdresse)
	 */
	@Override
	public void setBusAdresse(BusAdresse busAdresse) {
		this.busAdresse = busAdresse;

	}

	/**
	 * Testet ob er Funktioniert.
	 * 
	 * @return true für den fall das er Funktioniert.
	 */
	public boolean testeFunktion() {
		return state.testeFunktion();
	}

}
